#requires AutoHotkey v1.1
-; UltimateKEYS (for AutoHotkey v1.1).ahk - 2025-01-29
+; UltimateKEYS (for AutoHotkey v1.1).ahk - 2025-02-19
; Website : https://pieter-degroote.github.io/UltimateKEYS/
SendMode Input ; optimizes for faster and more reliable input
+global gEndKeys := "{bs}{esc}" ; ends dead key input on Backspace or Escape
+
; Compose Key Sequences (declaration)
-compose := ComObjCreate("Scripting.Dictionary")
+global compose := ComObjCreate("Scripting.Dictionary")
; Compose : Acute Accent
compose.item[".G"] := "{u+0120}" ; (Ġ) G with dot above
compose.item[".h"] := "{u+1e23}" ; (ḣ) h with dot above
compose.item[".H"] := "{u+1e22}" ; (Ḣ) H with dot above
-compose.item[".i"] := "{u+0131}" ; (ı) dotless i (Turkish, Azerbaijani)
-compose.item[".I"] := "{u+0130}" ; (İ) I with dot above (Turkish, Azerbaijani)
+compose.item[".i"] := "{u+0131}" ; (ı) dotless i
+compose.item[".I"] := "{u+0130}" ; (İ) I with dot above
compose.item[".j"] := "{u+0237}" ; (ȷ) dotless j
compose.item[".l"] := "{u+0140}" ; (ŀ) l with middle dot
compose.item[".L"] := "{u+013f}" ; (Ŀ) L with middle dot
compose.item[".O"] := "{u+022e}" ; (Ȯ) O with dot above
compose.item[".p"] := "{u+1e57}" ; (ṗ) p with dot above
compose.item[".P"] := "{u+1e56}" ; (Ṗ) P with dot above
-compose.item[".q"] := "{u+1e9b}" ; (ẛ) long s with dot above
compose.item[".r"] := "{u+1e59}" ; (ṙ) r with dot above
compose.item[".R"] := "{u+1e58}" ; (Ṙ) R with dot above
compose.item[".s"] := "{u+1e61}" ; (ṡ) s with dot above
compose.item["-D"] := "{u+0110}" ; (Đ) D with stroke
compose.item["-e"] := "{u+0113}" ; (ē) e with macron
compose.item["-E"] := "{u+0112}" ; (Ē) E with macron
-compose.item["-g"] := "{u+01e5}" ; (ǥ) g with stroke (Skolt Sami)
-compose.item["-G"] := "{u+01e4}" ; (Ǥ) G with stroke (Skolt Sami)
-compose.item["-h"] := "{u+0127}" ; (ħ) h with stroke (Maltese)
-compose.item["-H"] := "{u+0126}" ; (Ħ) H with stroke (Maltese)
+compose.item["-g"] := "{u+01e5}" ; (ǥ) g with stroke
+compose.item["-G"] := "{u+01e4}" ; (Ǥ) G with stroke
+compose.item["-h"] := "{u+0127}" ; (ħ) h with stroke
+compose.item["-H"] := "{u+0126}" ; (Ħ) H with stroke
compose.item["-i"] := "{u+012b}" ; (ī) i with macron
compose.item["-I"] := "{u+012a}" ; (Ī) I with macron
compose.item["-j"] := "{u+0249}" ; (ɉ) j with stroke
; Compose : Macron and Stroke (additional)
-compose.item["_f"] := "{u+1e9d}" ; (ẝ) long s with high stroke
compose.item["_g"] := "{u+1e21}" ; (ḡ) g with macron
compose.item["_G"] := "{u+1e20}" ; (Ḡ) G with macron
compose.item["_i"] := "{u+0268}" ; (ɨ) i with stroke
compose.item["bD"] := "{u+0189}" ; (Ɖ) capital letter African D
compose.item["be"] := "{u+0115}" ; (ĕ) e with breve
compose.item["bE"] := "{u+0114}" ; (Ĕ) E with breve
-compose.item["bf"] := "{u+0259}" ; (ə) small letter schwa (Azerbaijani)
-compose.item["bF"] := "{u+018f}" ; (Ə) capital letter schwa (Azerbaijani)
compose.item["bg"] := "{u+011f}" ; (ğ) g with breve
compose.item["bG"] := "{u+011e}" ; (Ğ) G with breve
compose.item["bi"] := "{u+012d}" ; (ĭ) i with breve
compose.item["bI"] := "{u+012c}" ; (Ĭ) I with breve
compose.item["bo"] := "{u+014f}" ; (ŏ) o with breve
compose.item["bO"] := "{u+014e}" ; (Ŏ) O with breve
-compose.item["bs"] := "{u+0219}" ; (ș) s with comma below (Romanian)
-compose.item["bS"] := "{u+0218}" ; (Ș) S with comma below (Romanian)
-compose.item["bt"] := "{u+021b}" ; (ț) t with comma below (Romanian)
-compose.item["bT"] := "{u+021a}" ; (Ț) T with comma below (Romanian)
+compose.item["bs"] := "{u+0219}" ; (ș) s with comma below
+compose.item["bS"] := "{u+0218}" ; (Ș) S with comma below
+compose.item["bt"] := "{u+021b}" ; (ț) t with comma below
+compose.item["bT"] := "{u+021a}" ; (Ț) T with comma below
compose.item["bu"] := "{u+016d}" ; (ŭ) u with breve
compose.item["bU"] := "{u+016c}" ; (Ŭ) U with breve
-compose.item["bw"] := "{u+01bf}" ; (ƿ) small letter wynn
-compose.item["bW"] := "{u+01f7}" ; (Ƿ) capital letter wynn
-compose.item["by"] := "{u+021d}" ; (ȝ) small letter yogh
-compose.item["bY"] := "{u+021c}" ; (Ȝ) capital letter yogh
compose.item["b3"] := "{u+0292}" ; (ʒ) small letter ezh
compose.item["b#"] := "{u+01b7}" ; (Ʒ) capital letter ezh
compose.item["lS"] := "{u+01a9}" ; (Ʃ) Latin capital letter esh
compose.item["lu"] := "{u+028a}" ; (ʊ) Latin small letter upsilon
compose.item["lU"] := "{u+01b1}" ; (Ʊ) Latin capital letter upsilon
+compose.item["lw"] := "{u+01bf}" ; (ƿ) small letter wynn
+compose.item["lW"] := "{u+01f7}" ; (Ƿ) capital letter wynn
+compose.item["ly"] := "{u+021d}" ; (ȝ) small letter yogh
+compose.item["lY"] := "{u+021c}" ; (Ȝ) capital letter yogh
compose.item["l8"] := "{u+0223}" ; (ȣ) small letter ou
compose.item["l*"] := "{u+0222}" ; (Ȣ) capital letter OU
compose.item["l7"] := "{u+0242}" ; (ɂ) small letter glottal stop
; Compose : Various Symbols
compose.item["sa"] := "{u+2100}" ; (℀) account of
-compose.item["sb"] := "{u+203d}" ; (‽) interrobang
-compose.item["sB"] := "{u+2e18}" ; (⸘) inverted interrobang
compose.item["sc"] := "{u+2105}" ; (℅) care of
compose.item["sd"] := "{u+22c4}" ; (⋄) diamond operator
compose.item["se"] := "{u+212e}" ; (℮) estimated symbol
compose.item["AE"] := "{u+00c6}" ; (Æ) letter AE
compose.item["dh"] := "{u+00f0}" ; (ð) small letter eth
compose.item["DH"] := "{u+00d0}" ; (Ð) capital letter eth
+compose.item["ee"] := "{u+0259}" ; (ə) small letter schwa
+compose.item["EE"] := "{u+018f}" ; (Ə) capital letter schwa
compose.item["fs"] := "{u+017f}" ; (ſ) small letter long s
compose.item["ij"] := "{u+0133}" ; (ij) ligature ij
compose.item["IJ"] := "{u+0132}" ; (IJ) ligature IJ
compose.item[".-"] := "{u+00b7}" ; (·) middle dot
compose.item[".3"] := "{u+2026}" ; (…) horizontal ellipsis
compose.item[".."] := "{u+2026}" ; (…) horizontal ellipsis
-compose.item["a-"] := "{u+00aa}" ; (ª) feminine ordinal indicator (Spanish, Portuguese, Italian, Galician)
-compose.item["o-"] := "{u+00ba}" ; (º) masculine ordinal indicator (Spanish, Portuguese, Italian, Galician)
+compose.item["a-"] := "{u+00aa}" ; (ª) feminine ordinal indicator
+compose.item["o-"] := "{u+00ba}" ; (º) masculine ordinal indicator
compose.item["!!"] := "{u+00a1}" ; (¡) inverted exclamation mark
compose.item["??"] := "{u+00bf}" ; (¿) inverted question mark
+compose.item["!?"] := "{u+203d}" ; (‽) interrobang
+compose.item["?!"] := "{u+2e18}" ; (⸘) inverted interrobang
compose.item["oc"] := "{u+00a9}" ; (©) copyright sign
compose.item["(c"] := "{u+00a9}" ; (©) copyright sign
compose.item["op"] := "{u+2117}" ; (℗) sound recording copyright
compose.item[";h"] := "{u+2043}" ; (⁃) hyphen bullet
compose.item[";t"] := "{u+2023}" ; (‣) triangular bullet
compose.item[";;"] := "{u+2022}" ; (•) bullet
+compose.item[":("] := "{u+2639}" ; (☹) white frowning face
+compose.item[":)"] := "{u+263a}" ; (☺) white smiling face
+compose.item[";)"] := "{u+263b}" ; (☻) black smiling face
+compose.item["<3"] := "{u+2665}" ; (♥) black heart suit
compose.item["[]"] := "{u+2610}" ; (☐) ballot box
compose.item["[v"] := "{u+2611}" ; (☑) ballot box with check
compose.item["[y"] := "{u+2611}" ; (☑) ballot box with check
>!sc056:: ; Right Alt + ISO Key
<^>!sc029:: ; AltGr + Grave Accent
<^>!sc056:: ; AltGr + ISO Key
- keys := InputHook("L2", "{esc}")
- keys.Start()
- keys.Wait()
- Send % compose.item[keys.Input]
+ ih := InputHook("L2", gEndKeys)
+ ih.Start(), ih.Wait()
+ Send % compose.item[ih.Input]
return